package tsi

import (
	watchmessgae "earth/watch_tcp/watch_message"
	"errors"
	"strconv"

	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

/*
终端发送:
[DW*YYYYYYYYYYYYYYY*LEN*KA,日期，步数,翻滚次数,电量百分数,车载里程数(km)]
实例:[DW*334588000000156*0014*KA,120414,50,100,100,100.12]
平台回复:
[DW*YYYYYYYYYYYYYYY*LEN*KA]
实例:[DW*334588000000156*0002*KA]
说明:链路保持数据每 5 分钟发一次,若终端未收到服务器的回复,则会一分钟重连一次，重连 5 次
后一直
连接不上服务器，终端就会重启. 日期格式为(年月日)，比如 120414，表示 2012 年 4 月 14 日；（手表所在地日期）
步数为当天的总步数，翻滚次数表示当天的总翻滚次数（用于睡眠监控），电量百分数为当前的电量，
用 0-100 表示。车载里程数为历史总里程数，没有传 0 或不传即可。
如没有步数和翻滚次数则传 0 即可
*/

// 链路保持
type KA struct {
	Date           string  // 日期
	StepCount      int     // 步数
	RollTimes      int     // 翻滚次数
	BatteryPercent int     // 电量百分数
	VehicleMileage float64 // 车载里程数
}

func DealKA(watchMessage *watchmessgae.WatchMessage, deviceID string) error {
	// 校验消息长度
	if len(watchMessage.MessageContentList) < 5 {
		logrus.Error("message is too short:", watchMessage.MessageContentList)
		return errors.New("message is too short")
	}
	// 解析消息内容
	ka := &KA{}
	ka.Date = watchMessage.MessageContentList[0]
	// strconv.Atoi()函数用于将字符串类型的整数转换为int类型
	stepCount, err := strconv.Atoi(watchMessage.MessageContentList[1])
	if err != nil {
		return err
	}
	ka.StepCount = stepCount
	rollTimes, err := strconv.Atoi(watchMessage.MessageContentList[2])
	if err != nil {
		return err
	}
	ka.RollTimes = rollTimes
	batteryPercent, err := strconv.Atoi(watchMessage.MessageContentList[3])
	if err != nil {
		return err
	}
	ka.BatteryPercent = batteryPercent
	vehicleMileage, err := strconv.ParseFloat(watchMessage.MessageContentList[4], 64)
	if err != nil {
		return err
	}
	ka.VehicleMileage = vehicleMileage
	// 发送遥测数据到平台
	if viper.GetString("version") == "new" {
		return SendTelemetry(deviceID, ka)
	} else {
		return SendProperty(watchMessage.IMEI, ka)
	}

}
